package com.aijk.commons.dict;

import com.aijk.commons.exception.ErrorCodeConst;
import com.aijk.commons.exception.ErrorCodeException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * 数据字典工具类
 * Created by iscdw on 2016/4/12.
 */
@Component
public class DictHelper implements ApplicationContextAware {

    private static DictService dictService = null;


    /**
     * 校验必填参数是否为字典定义范围内的值
     *
     * @param cid   字典代码
     * @param value 待校验的值
     * @param name  校验的字段名称，校验失败抛出异常时使用，为了显示友好的错误信息
     */
    public static void check(String cid, String value, String name) {
        if (StringUtils.isEmpty(value)) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.EMPTY_MSG, name));
        }
        if (!DictHelper.containsIidKey(cid, value)) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.DICT_ERROR, name, value));
        }
    }

    /**
     * 校验必填参数是否为字典定义范围内的GB值
     *
     * @param cid   字典代码
     * @param value 待校验的值
     * @param name  校验的字段名称，校验失败抛出异常时使用，为了显示友好的错误信息
     */
    public static void checkGB(String cid, String value, String name) {
        if (StringUtils.isEmpty(value)) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.EMPTY_MSG, name));
        }
        if (!DictHelper.containsGBKey(cid, value)) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.DICT_ERROR, name, value));
        }
    }

    /**
     * 如果字符类型的参数不为空则进行校验
     *
     * @param cid   字典代码
     * @param value 待校验的值
     * @param name  校验的字段名称，校验失败抛出异常时使用，为了显示友好的错误信息
     */
    public static void checkIfNotEmpty(String cid, String value, String name) {
        if (StringUtils.isEmpty(value)) {
            return;
        }
        if (!DictHelper.containsIidKey(cid, value)) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.DICT_ERROR, name, value));
        }
    }

    /**
     * 如果Integer类型的参数不为空则进行校验
     *
     * @param cid   字典代码
     * @param value 待校验的值
     * @param name  校验的字段名称，校验失败抛出异常时使用，为了显示友好的错误信息
     */
    public static void checkIfNotEmpty(String cid, Integer value, String name) {
        if (value == null) {
            return;
        }
        if (!DictHelper.containsIidKey(cid, value.toString())) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.DICT_ERROR, name, value));
        }
    }

    /**
     * 如果Long类型的参数不为空则进行校验
     *
     * @param cid   字典代码
     * @param value 待校验的值
     * @param name  校验的字段名称，校验失败抛出异常时使用，为了显示友好的错误信息
     */
    public static void checkIfNotEmpty(String cid, Long value, String name) {
        if (value == null) {
            return;
        }
        if (!DictHelper.containsIidKey(cid, value.toString())) {
            throw new ErrorCodeException(ErrorCodeConst.GLOBAL_REQCHK_ERROR, String.format(ErrorCodeConst.DICT_ERROR, name, value));
        }
    }

    /**
     * 根据自定义代码值获取字典文本值
     *
     * @param cid 字典类目
     * @param iid 自定义字典代码
     * @return
     */
    public static String getTitleByIid(String cid, String iid) {
        return dictService.getTitleByIid(cid, iid);
    }

    /**
     * 根据国标代码值获取字典文本值
     *
     * @param cid    字典类目
     * @param gbcode 国标代码
     * @return
     */
    public static String getTitleByGb(String cid, String gbcode) {
        return dictService.getTitleByGb(cid, gbcode);
    }

    /**
     * 根据字典代码获取字典值列表
     *
     * @param cid
     * @return
     */
    public static List<Dict> getDictList(String cid) {
        return dictService.getDictList(cid);
    }

    /**
     * 判断自定义字典类目下是否存在该自定义代码的条目
     *
     * @param cid  字典类目
     * @param code 自定义字典代码
     * @return
     */
    public static boolean containsIidKey(String cid, String code) {
        return dictService.containsIidKey(cid, code);
    }

    /**
     * 判断字典类目下是否存在该国标代码的条目
     *
     * @param cid
     * @param gbcode
     * @return
     */
    public static boolean containsGBKey(String cid, String gbcode) {
        return dictService.containsGBKey(cid, gbcode);
    }

    @Override
    public void setApplicationContext(ApplicationContext context) throws BeansException {
        dictService = context.getBean(DictService.class);
    }

}
